﻿
namespace Anderson.NetLobby.Common
{
    public class MessageSerialize
    {
        public static byte[] Serialize<T>(NetMessage<T> message)
        {
            byte[] bytesOfContent = ObjectSerialize.Serialize(message.MessageContent);

            byte[] bytes = null;
            using (ByteStream byteStream = new ByteStream())
            {
                byteStream.Write(message.MessageLength);
                byteStream.Write(message.MessageBOF);
                byteStream.Write(message.MessageLevel1);
                byteStream.Write(message.MessageLevel2);
                byteStream.Write(message.MessageLevel3);
                byteStream.Write(message.RoomId);
                byteStream.Write(bytesOfContent);
                byteStream.Write(message.MessageEOF);

                bytes = byteStream.GetBytes();
            }

            return bytes;
        }

        public static NetMessage<T> Deserialize<T>(byte[] bytes)
        {
            NetMessage<T> message = new NetMessage<T>();

            using (ByteStream byteStream = new ByteStream(bytes))
            {
                int sizeOfUInt32 = sizeof(uint);
                int sizeOfLong = sizeof(long);

                int size = sizeOfUInt32 * 6 + sizeOfLong;
                int count = bytes.Length - size;

                message.MessageLength = byteStream.ReadUInt32();
                message.MessageBOF = byteStream.ReadUInt32();
                message.MessageLevel1 = byteStream.ReadUInt32();
                message.MessageLevel2 = byteStream.ReadUInt32();
                message.MessageLevel3 = byteStream.ReadUInt32();
                message.RoomId = byteStream.ReadInt64();

                byte[] contentBytes = byteStream.ReadBytes(count);
                message.MessageContent = (T)ObjectSerialize.Deserialize(contentBytes);

                message.MessageEOF = byteStream.ReadUInt32();
            }

            return message;
        }
    }
}
